params = {
    # 基础配置参数
    "client_num": 100,                        # 老人数量
    "caregiver_num": 100,                     # 护理员数量

    # 遗传算法参数
    "population_size": 500,                  # 种群大小
    "crossover_rate": 0.3,                  # 交叉率
    "mutation_rate": 0.115,                 # 变异率
    "phenotype_limit": 200,                 # 表现型限制
    "elimination_size": 5,                  # 淘汰规模

    # 模拟退火算法参数
    "initial_temperature": 100.0,           # 初始温度
    "cooling_rate": 0.995,                  # 冷却率

    # 时间段配置
    "time_slots_per_day": 72,               # 每天时间段数量
    "time_interval_minutes": 20,            # 时间段间隔(分钟)

    # 权重和惩罚参数
    "caregiver_availability_weight": 0.3,   # 护理员可用性权重
    "scheduling_conflict_penalty": 50,      # 排班冲突惩罚
    "unassigned_slot_penalty": 30,          # 未分配时间段惩罚

    # 算法优化控制
    "use_algorithm_optimization": True,     # 是否使用算法优化

    # 强化学习参数
    "rl_learning_rate": 0.1,                # 学习率
    "rl_discount_factor": 0.9,              # 折扣因子
    "rl_exploration_rate": 0.1,             # 探索率
    "rl_exploration_decay": 0.995,          # 探索衰减率
    "rl_min_exploration_rate": 0.01,        # 最小探索率
}

# 添加三班制排班相关配置
shift_config = {
    # 标准三班制配置
    "one_shift": {                    # 班次1配置
        "start_time": "00:00",        # 班次1开始时间
        "end_time": "08:00",          # 班次1结束时间
        "name": "班次1",              # 班次名称
        "order": 1,                   # 班次顺序
    },
    "two_shift": {                    # 班次2配置
        "start_time": "08:00",        # 班次2开始时间
        "end_time": "16:00",          # 班次2结束时间
        "name": "班次2",              # 班次名称
        "order": 2,                   # 班次顺序
    },
    "three_shift": {                  # 班次3配置
        "start_time": "16:00",        # 班次3开始时间
        "end_time": "00:00",          # 班次3结束时间
        "name": "班次3",              # 班次名称
        "order": 3,                   # 班次顺序
    },
    # 保留旧的班次名称以兼容历史数据
    "morning_shift": {                # 早班配置
        "start_time": "00:00",        # 早班开始时间
        "end_time": "08:00",          # 早班结束时间
        "name": "班次1",              # 班次名称
        "order": 1,                   # 班次顺序
    },
    "afternoon_shift": {              # 中班配置
        "start_time": "08:00",        # 中班开始时间
        "end_time": "16:00",          # 中班结束时间
        "name": "班次2",              # 班次名称
        "order": 2,                   # 班次顺序
    },
    "night_shift": {                  # 夜班配置
        "start_time": "16:00",        # 夜班开始时间
        "end_time": "00:00",          # 夜班结束时间
        "name": "班次3",              # 班次名称
        "order": 3,                   # 班次顺序
    },
    # 数字标识班次配置（用于前端传参）
    "1": {                            # 班次1配置
        "name": "1",                  # 班次名称
        "start_time": "00:00",        # 开始时间
        "end_time": "08:00",          # 结束时间
        "order": 4,                   # 班次顺序
    },
    "2": {                            # 班次2配置
        "name": "2",                  # 班次名称
        "start_time": "08:00",        # 开始时间
        "end_time": "16:00",          # 结束时间
        "order": 5,                   # 班次顺序
    },
    "3": {                            # 班次3配置
        "name": "3",                  # 班次名称
        "start_time": "16:00",        # 开始时间
        "end_time": "00:00",          # 结束时间
        "order": 6,                   # 班次顺序
    },
}

# 护理员白天/夜班分配的权重比（默认为黄金分割比1.618）
day_night_ratio = 1.618

# 预留护理资源比例，用于应对新入住老人的临时需求
reserve_resource_ratio = 0.1

# 班制控制参数
shift_control = {
    "enabled_shifts": [                # 启用的班次列表
        "one_shift",                   # 启用班次1
        "two_shift",                   # 启用班次2
        "three_shift",                 # 启用班次3
    ],
    "min_shifts_per_day": 1,           # 每天最少班次数
    "max_shifts_per_day": 3,           # 每天最多班次数
    "allow_empty_shifts": True,        # 是否允许空班次（无排班时段）
    "shift_sort_method": "time",       # 班次排序方法（按时间排序）
    "auto_adjust_time": True,          # 是否自动调整班次时间以覆盖24小时
}

# 三班制排班接口全局参数
three_shift_params = {
    "schedule_type": 1,                        # 排班类型：1=按天，2=按周，3=按月，4=按季度，5=按年
    "start_date": "2025-09-25",                # 排班开始日期
    "num_days": 3,                             # 排班天数
    "shift_start_time": "00:00",               # 排班起始时间（具有最高优先级）
    "shift_mode": 3,                           # 班制模式：1=一班制，2=二班制，3=三班制
    "custom_shifts": [                         # 自定义班次列表
        1,                                     # 使用班次1
        3,                                     # 使用班次3
    ],
    "time_slots_per_day": 72,                  # 每天时间段数量
    "time_interval_minutes": 20,               # 时间段间隔(分钟)
    "day_segments": 3,                         # 一天分为几段（班制数量）
    "first_segment_start": "00:00",            # 第一段开始时间
    "first_segment_end": "08:00",              # 第一段结束时间
    "param_priority_enabled": True,            # 是否启用参数优先级（接收到参数时优先使用传参）
    "current_day_only": False,                # 是否只进行当天排班（00:00-23:59），具有最高优先级，默认关闭
    "allow_cross_day": True,                   # 是否允许跨天排班
    "use_fixed_shift_times": False,             # 是否使用固定班次时间
    "use_global_multi_day_params": False,       # 是否在传参情况下使用全局多天排班参数
    "hide_unassigned_activities": True,       # 是否隐藏未分配活动（Caregiver为None的记录），具有最高优先级，默认关闭

    # 自动排班相关参数
    "auto_schedule_enabled": False,            # 是否启用自动排班功能
    "auto_schedule_immediate": True,           # 是否在接口调用时立即执行一次排班
    "auto_schedule_minutes": 7,                # 自动排班间隔时间(分钟)
    "auto_schedule_generate_care_timeline": True, # 是否生成照护时间线
    "last_params_update": None,                # 最后一次参数更新时间和内容
}

# 班制模式配置
shift_mode_config = {
    # 一班制配置
    "one_shift": {
        "name": "一班制",                      # 班制名称
        "shifts": [
            "one_shift",                      # 使用班次1
        ],
        "description": "全天24小时一个班次",    # 班制描述
        "hours_per_shift": 24.0,              # 每班时长(小时)
    },
    # 二班制配置
    "two_shift": {
        "name": "二班制",                      # 班制名称
        "shifts": [
            "one_shift",                      # 使用班次1
            "two_shift",                      # 使用班次2
        ],
        "description": "全天分为两个班次，每班12小时", # 班制描述
        "hours_per_shift": 12.0,              # 每班时长(小时)
    },
    # 三班制配置
    "three_shift": {
        "name": "三班制",                      # 班制名称
        "shifts": [
            "one_shift",                      # 使用班次1
            "two_shift",                      # 使用班次2
            "three_shift",                    # 使用班次3
        ],
        "description": "全天分为三个班次，每班8小时", # 班制描述
        "hours_per_shift": 8.0,               # 每班时长(小时)
    },
    # 自定义班制配置
    "custom": {
        "name": "自定义班制",                  # 班制名称
        "shifts": [],                         # 使用的班次列表（空表示自定义）
        "description": "自定义班次数量和时间",  # 班制描述
        "hours_per_shift": None,              # 每班时长(小时)（None表示自定义）
    },
}

# 护理员休息时间控制参数
rest_time_control = {
    "min_rest_between_shifts": 8,             # 班次间最小休息时间(小时)
    "min_rest_after_night_shift": 12,         # 夜班后最小休息时间(小时)
    "max_consecutive_shifts": 3,              # 最大连续工作班次数

    # 班次转换休息时间要求
    "shift_transition_rest": {
        "one_shift_to_two_shift": 8,            # 班次1到班次2的休息时间(小时)
        "two_shift_to_three_shift": 10,         # 班次2到班次3的休息时间(小时)
        "three_shift_to_one_shift": 12,         # 班次3到班次1的休息时间(小时)
        "one_shift_to_three_shift": 16,         # 班次1到班次3的休息时间(小时)
        "two_shift_to_one_shift": 8,            # 班次2到班次1的休息时间(小时)
        "three_shift_to_two_shift": 10,         # 班次3到班次2的休息时间(小时)
        # 保留旧的映射以兼容历史数据
        "morning_shift_to_afternoon_shift": 8,  # 早班到中班的休息时间(小时)
        "afternoon_shift_to_night_shift": 10,   # 中班到夜班的休息时间(小时)
        "night_shift_to_morning_shift": 12,     # 夜班到早班的休息时间(小时)
        "morning_shift_to_night_shift": 16,     # 早班到夜班的休息时间(小时)
        "afternoon_shift_to_morning_shift": 8,  # 中班到早班的休息时间(小时)
        "night_shift_to_afternoon_shift": 10,   # 夜班到中班的休息时间(小时)
    },

    "max_weekly_work_hours": 40,              # 每周最大工作时间(小时)
    "max_weekly_night_shifts": 3,             # 每周最大夜班数量
    "require_weekend_rest": True,             # 是否要求周末休息
    "max_weekend_shifts_per_month": 2,        # 每月最大周末班次数
    "balance_shift_distribution": True,       # 是否平衡班次分配
    "rotation_pattern": "forward",            # 轮班模式："forward"=正向轮班，"backward"=反向轮班
}
